﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using WebApplication1.Servidor1;

namespace WebApplication1
{
    public partial class Reportes : System.Web.UI.Page
    {
        Service1 servidor;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["NombreUsuario"] == null)
                Response.Redirect("Login.aspx");
            servidor = (Service1)Session["Server"];
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            DataTable table = new DataTable("Balance de comprobación");
            table.Columns.Add("Código de la cuenta");
            table.Columns.Add("Nombre de la cuenta");
            table.Columns.Add("Debe");
            table.Columns.Add("Haber");

            List<String> cuentas = servidor.Obtener_Saldos_Cuentas(false, Session["NombreEmpresaUsuario"].ToString()).ToList();
            float debe = 0, haber = 0;
            char cod1;

            foreach (String cuenta in cuentas)
            {
                DataRow tablerow = table.NewRow();
                tablerow["Código de la cuenta"] = cuenta.Split(';')[0];
                cod1 = cuenta.Split(';')[0][0];
                tablerow["Nombre de la cuenta"] = cuenta.Split(';')[1];
                if (cod1 == '1' || cod1 == '5' || cod1 == '6' || cod1 == '8')
                {
                    tablerow["Debe"] = cuenta.Split(';')[2];
                    tablerow["Haber"] = "";
                    debe += Convert.ToSingle(cuenta.Split(';')[2]);
                }
                else
                {
                    tablerow["Debe"] = "";
                    tablerow["Haber"] = cuenta.Split(';')[2];
                    haber += Convert.ToSingle(cuenta.Split(';')[2]);
                }
                table.Rows.Add(tablerow);
            }

            DataRow finalRow = table.NewRow();
            finalRow["Nombre de la cuenta"] = "Total:";
            finalRow["Debe"] = debe+"";
            finalRow["Haber"] = haber + "";
            table.Rows.Add(finalRow);

            GridView1.DataSource = table;
            GridView1.DataBind();
        }

        protected void Button2_Click(object sender, EventArgs e)
        {
            DataTable table = new DataTable("Estado de resultados");
            table.Columns.Add("Código de la cuenta");
            table.Columns.Add("Nombre de la cuenta");
            table.Columns.Add("Monto");

            DataRow tituloIngresos = table.NewRow();
            tituloIngresos["Código de la cuenta"] = "Ingresos";
            table.Rows.Add(tituloIngresos);
            
            List<String> ingresos = servidor.Obtener_Cuentas_Codigo('4', Session["NombreEmpresaUsuario"].ToString()).ToList();
            float totalIngresos = Sum(ingresos, table, "Código de la cuenta", "Nombre de la cuenta", "Monto");
            DataRow drIngresos = table.NewRow();
            drIngresos["Nombre de la cuenta"] = "Total ingresos:";
            drIngresos["Monto"] = ""+totalIngresos;
            table.Rows.Add(drIngresos);
            
            DataRow tituloGastos = table.NewRow();
            tituloGastos["Código de la cuenta"] = "Gastos";
            table.Rows.Add(tituloGastos);
            
            List<String> gastos = servidor.Obtener_Cuentas_Codigo('6', Session["NombreEmpresaUsuario"].ToString()).ToList();
            List<String> costos = servidor.Obtener_Cuentas_Codigo('7', Session["NombreEmpresaUsuario"].ToString()).ToList();
            float totalGastos = Sum(gastos, table, "Código de la cuenta", "Nombre de la cuenta", "Monto");
            float totalCostos = Sum(costos, table, "Código de la cuenta", "Nombre de la cuenta", "Monto");
            DataRow drGastos = table.NewRow();
            drGastos["Nombre de la cuenta"] = "Total Gastos:";
            drGastos["Monto"] = "" + (totalGastos + totalCostos);
            table.Rows.Add(drGastos);

            DataRow drUtilidadOperativa = table.NewRow();
            drUtilidadOperativa["Nombre de la cuenta"] = "Utilidad operativa:";
            float utilidadOperativa = totalIngresos - totalGastos;
            drUtilidadOperativa["Monto"] = utilidadOperativa + "";
            table.Rows.Add(drUtilidadOperativa);

            DataRow tituloPartidasExtraordinarias = table.NewRow();
            tituloPartidasExtraordinarias["Código de la cuenta"] = "Partidas extraordinarias";
            table.Rows.Add(tituloPartidasExtraordinarias);

            List<String> otrosIngresos = servidor.Obtener_Cuentas_Codigo('7', Session["NombreEmpresaUsuario"].ToString()).ToList();
            float totalOtrosIngresos = Sum(otrosIngresos, table, "Código de la cuenta", "Nombre de la cuenta", "Monto");
            List<String> otrosGastos = servidor.Obtener_Cuentas_Codigo('8', Session["NombreEmpresaUsuario"].ToString()).ToList();
            float totalOtrosGastos = Sum(otrosGastos, table, "Código de la cuenta", "Nombre de la cuenta", "Monto");
            DataRow drutilidadBruta = table.NewRow();
            drutilidadBruta["Nombre de la cuenta"] = "Utilidad bruta:";
            float utilidadBruta = utilidadOperativa + totalOtrosIngresos - totalOtrosGastos;
            drutilidadBruta["Monto"] = "" + utilidadBruta;
            table.Rows.Add(drutilidadBruta);

            DataRow drIR = table.NewRow();
            drIR["Nombre de la cuenta"] = "Impuesto de renta:";
            float impuestoRenta = Convert.ToSingle(TextBox1.Text) * utilidadBruta;
            drIR["Monto"] = "" + impuestoRenta;
            table.Rows.Add(drIR);

            DataRow drUtilidadNeta = table.NewRow();
            drUtilidadNeta["Nombre de la cuenta"] = "Utilidad neta:";
            float utilidadNeta = utilidadBruta - impuestoRenta;
            drUtilidadNeta["Monto"] = "" + utilidadNeta;
            table.Rows.Add(drUtilidadNeta);

            DataRow drDividendos = table.NewRow();
            drDividendos["Nombre de la cuenta"] = "Dividendos:";
            float dividendos = Convert.ToSingle(TextBox2.Text) * utilidadNeta;
            drDividendos["Monto"] = "" + dividendos;
            table.Rows.Add(drDividendos);

            DataRow drUtilidadRetenida = table.NewRow();
            drUtilidadRetenida["Nombre de la cuenta"] = "Utilidad retenida:";
            float utilidadRetenida = utilidadNeta - dividendos;
            drUtilidadRetenida["Monto"] = "" + utilidadRetenida;
            table.Rows.Add(drUtilidadRetenida);
            
            GridView1.DataSource = table;
            GridView1.DataBind();
        }

        protected void Button3_Click(object sender, EventArgs e)
        {
            DataTable table = new DataTable("Balance general de comprobación");
            table.Columns.Add("Código de la cuenta");
            table.Columns.Add("Nombre de la cuenta");
            table.Columns.Add("Monto");
            table.Columns.Add("Total");

            DataRow tituloActivos = table.NewRow();
            tituloActivos["Código de la cuenta"] = "Activos";
            table.Rows.Add(tituloActivos);

            List<String> activos = servidor.Obtener_Cuentas_Codigo('1', Session["NombreEmpresaUsuario"].ToString()).ToList();
            float totalActivos = Sum(activos, table, "Código de la cuenta", "Nombre de la cuenta", "Monto");
            DataRow drActivos = table.NewRow();
            drActivos["Monto"] = "Total activos:";
            drActivos["Total"] = "" + totalActivos;
            table.Rows.Add(drActivos);

            table.Rows.Add(table.NewRow());

            DataRow tituloPasivos = table.NewRow();
            tituloPasivos["Código de la cuenta"] = "Pasivos";
            table.Rows.Add(tituloPasivos);

            List<String> pasivos = servidor.Obtener_Cuentas_Codigo('2', Session["NombreEmpresaUsuario"].ToString()).ToList();
            float totalPasivos = Sum(pasivos, table, "Código de la cuenta", "Nombre de la cuenta", "Monto");
            DataRow drPasivos = table.NewRow();
            drPasivos["Nombre de la cuenta"] = "Total pasivos:";
            drPasivos["Monto"] = "" + totalPasivos;
            table.Rows.Add(drPasivos);

            DataRow tituloCapital = table.NewRow();
            tituloCapital["Código de la cuenta"] = "Capital";
            table.Rows.Add(tituloCapital);

            List<String> capital = servidor.Obtener_Cuentas_Codigo('3', Session["NombreEmpresaUsuario"].ToString()).ToList();
            float totalCapital = Sum(capital, table, "Código de la cuenta", "Nombre de la cuenta", "Monto");
            DataRow drCapital = table.NewRow();
            drCapital["Nombre de la cuenta"] = "Total capital:";
            drCapital["Monto"] = "" + totalCapital;
            table.Rows.Add(drCapital);

            DataRow drPC = table.NewRow();
            drPC["Monto"] = "Total pasivos y capital:";
            drPC["Total"] = ""+(totalPasivos+totalCapital);
            table.Rows.Add(drPC);

            GridView1.DataSource = table;
            GridView1.DataBind();
        }

        protected float Sum(List<String> cuentas, DataTable tabla, String a, String b, String c)
        {
            float sumatoria=0;
            foreach (String cuenta in cuentas)
            {
                DataRow tablerow = tabla.NewRow();
                tablerow[a] = cuenta.Split(';')[0];
                tablerow[b] = cuenta.Split(';')[1];
                tablerow[c] = cuenta.Split(';')[2];
                sumatoria += Convert.ToSingle(cuenta.Split(';')[2]);
                tabla.Rows.Add(tablerow);
            }
            return sumatoria;
        }
    }
}